﻿Imports Microsoft.DirectX
Imports Microsoft.DirectX.Direct3D
Imports System.Threading
Imports Commander_Wars.Spieletools
Public Class ObjektLadebildschirm
    Inherits ObjektFormMenü
    Const AnzeigeTextDauer As Long = TimeSpan.TicksPerSecond * 10
    Const MaxKOX As Integer = 5
    Public Shared ArmeeEiheitenZahl As Integer = 0
    Enum Lademodi
        Laden
        KOAuswahl
    End Enum
    Dim Lademodus As Lademodi = Lademodi.Laden
    Shared Zufallstexte As Boolean = False
    Dim LetzteAktualiesierung As Long
    Dim Duration As Long
    Dim Loadingthread As Thread
    Dim FrameTicks As Long

    Dim EinzelladeDauer As Long = 0
    Dim FertigGeladen As Boolean = False
    Dim Starten As Boolean = False
    Dim Fortschritt As Integer = 0
    Shared Beschreibung() As String = {}
    Dim Einheiten As AnimationLaufen() = {}
    Dim YMax As Integer = 0
    Dim XMax As Integer = 0
    Dim EinheitenMax As Integer = 50
    Shared Ladebalkenbreite As Integer = 0
    Shared Ladebalkenstart As Integer = 0
    Shared Text As ObjektText
    Public Pausiert As Boolean = False
    Public Shared Ladebildschirm As ObjektLadebildschirm
    Structure KOAuswahl
        Dim KOIDS() As Integer
        Dim Spieler As Integer
        Dim KONummer As Integer
        Public Sub New(ByVal KOIDS() As Integer, ByVal Spieler As Integer, ByVal KONummer As Integer)
            Me.KOIDS = KOIDS
            Me.Spieler = Spieler
            Me.KONummer = KONummer
        End Sub
    End Structure
    ''' <summary>
    ''' Wenn true kann nur ein KO von einer Armee immer mit spielen!
    ''' </summary>
    ''' <remarks></remarks>
    Dim EinKOProArmee As Boolean = False
    Shared KOAuswahlKOS() As KOAuswahl = {}
    Dim KO As Integer = -1
    Dim KOAnzeigeTextur As Texture = Nothing
    Dim SelectedKO As Integer = -1

#Region "Ladevariablen"
    Dim Name As String = ""
    Dim GesamterName As Boolean = False
    Dim Endung As String = ""
    Dim Texturenladen As Boolean = False
    Dim Updateframe As Boolean = False
#End Region
    Public Function Spielstarten() As Boolean
        Return Starten
    End Function
    Public Sub New(ByVal SpielerZahl As Integer, ByVal Beschreibung As String, ByVal Name As String, ByVal GesamterName As Boolean, ByVal Endung As String, ByVal TexturenLaden As Boolean, ByVal UpdateframeStarten As Boolean, Optional ByVal KOAuswahlKOS() As KOAuswahl = Nothing, Optional ByVal EinKOproArmee As Boolean = False)
        Ladebildschirm = Me
        Objektverwalter.Menü.ResetButton()
        Me.Name = Name
        Me.GesamterName = GesamterName
        Me.Endung = Endung
        Me.Texturenladen = TexturenLaden
        Me.Updateframe = Updateframe
        'Auswahl KO's updaten!
        If KOAuswahlKOS IsNot Nothing Then
            ObjektLadebildschirm.KOAuswahlKOS = KOAuswahlKOS
        End If
        Me.EinKOProArmee = EinKOproArmee
        'Wir initialisieren alles!
        Zufallstexte = False
        Text = New ObjektText(New String() {}, 0, 0, Nothing, "Arial", 12, FontStyle.Regular)
        SetBrechreibung(Beschreibung)
        EinzelladeDauer = My.Settings.DurchschnittlicheLadeZeit
        ObjektMaus.Visible = False

        ObjektMaus.Zustand = ObjektMaus.Zustände.Menü
        If My.Settings.Verhältnis = Hauptmenü.Breitbild Then
            Objektverwalter.LoadHintergrund(My.Settings.Resourcenpfad + "Hintergründe\HM1280a800.bmp")
        Else
            Objektverwalter.LoadHintergrund(My.Settings.Resourcenpfad + "Hintergründe\HM800a600.bmp")
        End If
        Dim R As Integer
        Ladebalkenbreite = Math.DivRem(Hauptmenü.MainMenü.MalPanel.Width - 200, 127, R)
        Ladebalkenstart = 100 + R / 2
        'Die Objekte zum Handeln hinzufügen.
        AddHandler Hauptmenü.MainMenü.MalPanel.MouseMove, AddressOf MouseMove
        AddHandler Hauptmenü.MainMenü.MalPanel.MouseDown, AddressOf MouseDown
        AddHandler Hauptmenü.MainMenü.KeyDown, AddressOf KeyDown
        AddHandler Hauptmenü.MainMenü.MalPanel.MouseMove, AddressOf MouseMove
        AddHandler Hauptmenü.MainMenü.MalPanel.MouseUp, AddressOf MouseUp

        'Damit etwas passiert vorerst
        Array.Resize(Einheiten, EinheitenMax)
        YMax = Math.DivRem(Hauptmenü.MainMenü.MalPanel.Height, 16, 0)
        XMax = Math.DivRem(Hauptmenü.MainMenü.MalPanel.Width, 16, 0)
        For I = 0 To Einheiten.Length - 1
            Dim Z As Integer = Zufallszahl(0, 12)
            Select Case Z
                Case 0
                    Einheiten(I) = New AnimationLaufen(New EinheitHöllium(-1, 0, 0, ), Armeen.OS.ToString, Hauptmenü.AlleFarbtabellen(Zufallszahl(0, Hauptmenü.AlleFarbtabellen.Length - 1)), New Integer() {0}, New Integer() {0}, New Point(Zufallszahl(0, XMax), Zufallszahl(0, YMax)))
                    NextZufallsWeg(I)
                Case 1
                    Einheiten(I) = New AnimationLaufen(New EinheitHoverflak(-1, 0, 0, ), Armeen.OS.ToString, Hauptmenü.AlleFarbtabellen(Zufallszahl(0, Hauptmenü.AlleFarbtabellen.Length - 1)), New Integer() {0}, New Integer() {0}, New Point(Zufallszahl(0, XMax), Zufallszahl(0, YMax)))
                    NextZufallsWeg(I)
                Case 2
                    Einheiten(I) = New AnimationLaufen(New EinheitAmphibienpanzer(-1, 0, 0, ), Armeen.OS.ToString, Hauptmenü.AlleFarbtabellen(Zufallszahl(0, Hauptmenü.AlleFarbtabellen.Length - 1)), New Integer() {0}, New Integer() {0}, New Point(Zufallszahl(0, XMax), Zufallszahl(0, YMax)))
                    NextZufallsWeg(I)
                Case 3
                    Einheiten(I) = New AnimationLaufen(New EinheitAufklärer(-1, 0, 0, ), Armeen.OS.ToString, Hauptmenü.AlleFarbtabellen(Zufallszahl(0, Hauptmenü.AlleFarbtabellen.Length - 1)), New Integer() {0}, New Integer() {0}, New Point(Zufallszahl(0, XMax), Zufallszahl(0, YMax)))
                    NextZufallsWeg(I)
                Case 4
                    Einheiten(I) = New AnimationLaufen(New EinheitFlak(-1, 0, 0, ), Armeen.OS.ToString, Hauptmenü.AlleFarbtabellen(Zufallszahl(0, Hauptmenü.AlleFarbtabellen.Length - 1)), New Integer() {0}, New Integer() {0}, New Point(Zufallszahl(0, XMax), Zufallszahl(0, YMax)))
                    NextZufallsWeg(I)
                Case 5
                    Einheiten(I) = New AnimationLaufen(New EinheitJagdpanzer(-1, 0, 0, ), Armeen.OS.ToString, Hauptmenü.AlleFarbtabellen(Zufallszahl(0, Hauptmenü.AlleFarbtabellen.Length - 1)), New Integer() {0}, New Integer() {0}, New Point(Zufallszahl(0, XMax), Zufallszahl(0, YMax)))
                    NextZufallsWeg(I)
                Case 6
                    Einheiten(I) = New AnimationLaufen(New EinheitArtillerie(-1, 0, 0, ), Armeen.OS.ToString, Hauptmenü.AlleFarbtabellen(Zufallszahl(0, Hauptmenü.AlleFarbtabellen.Length - 1)), New Integer() {0}, New Integer() {0}, New Point(Zufallszahl(0, XMax), Zufallszahl(0, YMax)))
                    NextZufallsWeg(I)
                Case 7
                    Einheiten(I) = New AnimationLaufen(New EinheitKampfpanzer(-1, 0, 0, ), Armeen.OS.ToString, Hauptmenü.AlleFarbtabellen(Zufallszahl(0, Hauptmenü.AlleFarbtabellen.Length - 1)), New Integer() {0}, New Integer() {0}, New Point(Zufallszahl(0, XMax), Zufallszahl(0, YMax)))
                    NextZufallsWeg(I)
                Case 8
                    Einheiten(I) = New AnimationLaufen(New EinheitTitanpanzer(-1, 0, 0, ), Armeen.OS.ToString, Hauptmenü.AlleFarbtabellen(Zufallszahl(0, Hauptmenü.AlleFarbtabellen.Length - 1)), New Integer() {0}, New Integer() {0}, New Point(Zufallszahl(0, XMax), Zufallszahl(0, YMax)))
                    NextZufallsWeg(I)
                Case 9
                    Einheiten(I) = New AnimationLaufen(New EinheitMegapanzer(-1, 0, 0, ), Armeen.OS.ToString, Hauptmenü.AlleFarbtabellen(Zufallszahl(0, Hauptmenü.AlleFarbtabellen.Length - 1)), New Integer() {0}, New Integer() {0}, New Point(Zufallszahl(0, XMax), Zufallszahl(0, YMax)))
                    NextZufallsWeg(I)
                Case 10
                    Einheiten(I) = New AnimationLaufen(New EinheitBomber(-1, 0, 0, ), Armeen.OS.ToString, Hauptmenü.AlleFarbtabellen(Zufallszahl(0, Hauptmenü.AlleFarbtabellen.Length - 1)), New Integer() {0}, New Integer() {0}, New Point(Zufallszahl(0, XMax), Zufallszahl(0, YMax)))
                    NextZufallsWeg(I)
                Case 11
                    Einheiten(I) = New AnimationLaufen(New EinheitJäger(-1, 0, 0, ), Armeen.OS.ToString, Hauptmenü.AlleFarbtabellen(Zufallszahl(0, Hauptmenü.AlleFarbtabellen.Length - 1)), New Integer() {0}, New Integer() {0}, New Point(Zufallszahl(0, XMax), Zufallszahl(0, YMax)))
                    NextZufallsWeg(I)
                Case 12
                    Einheiten(I) = New AnimationLaufen(New EinheitKampfpanzer(-1, 0, 0, ), Armeen.OS.ToString, Hauptmenü.AlleFarbtabellen(Zufallszahl(0, Hauptmenü.AlleFarbtabellen.Length - 1)), New Integer() {0}, New Integer() {0}, New Point(Zufallszahl(0, XMax), Zufallszahl(0, YMax)))
                    NextZufallsWeg(I)
            End Select
            Einheiten(I).Visible = False
        Next
        'Ab jetzt malen wir
        Loadingthread = New Thread(AddressOf Laden)
        Loadingthread.Name = "Lade Thread"
        Loadingthread.Start()
        Cursor.Hide()
        Malen()
    End Sub
    Public Shared Sub SetBrechreibung(ByVal Beschreibung As String)
        If Beschreibung Is Nothing Then Beschreibung = ""
        SyncLock ObjektLadebildschirm.Beschreibung
            If Beschreibung = "Keine Beschreibung vorhanden." Or Beschreibung = "" Then
                ObjektLadebildschirm.Beschreibung = New String() {}
                ObjektLadebildschirm.Zufallstexte = True
            Else
                ObjektLadebildschirm.Beschreibung = ObjektText.getStringsZeilenweise(Beschreibung, Text.GetSchriftart, Hauptmenü.MainMenü.MalPanel.Width / 3)
                ObjektLadebildschirm.Zufallstexte = False
            End If
        End SyncLock
    End Sub
    Public Overrides Sub Frame()

    End Sub

    Public Overrides Sub IniMenü()

    End Sub

    Public Overrides Sub KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)

    End Sub
    Public Sub ButtonGeklicktLinks(ByVal Effekt As String)
        If Effekt = Nothing Then
            Exit Sub
        End If
        Select Case Effekt.ToLower
            Case "starten"
                Starten = True
            Case "weiter"
                UpdateTexturen(1)
            Case "zurück"
                UpdateTexturen(-1)
        End Select
    End Sub


    Public Overrides Sub Malen()
        Dim sngRotation As Double = 0
        Dim intColor As Color = Color.FromArgb(255, 255, 255, 255)
        FrameTicks = Now.Ticks
        Do While Not Starten
            Dim Ticks As Long = Now.Ticks

            Dim FT2 As Long = FrameTicks + CLng(TimeSpan.TicksPerSecond / My.Settings.SpielGeschwindigkeit)
            If FT2 > Ticks Then
                'Wir führen alles in der momentanen Schleife aus
                My.Application.DoEvents()
                Objekt2D.AlreadyKlickt = False
                Continue Do
            Else
                If Duration < EinzelladeDauer * ArmeeEiheitenZahl Then
                    Duration += (Ticks - FrameTicks)
                    Fortschritt = Duration / (EinzelladeDauer * ArmeeEiheitenZahl) * 100
                Else
                    Fortschritt = 100
                End If
                If Fortschritt >= 100 Then
                    If Not FertigGeladen Then
                        Fortschritt = 99
                    Else
                        Fortschritt = 100
                    End If
                End If
                FrameTicks = Now.Ticks
            End If
            'Dauer berechnen.
            For i = 0 To Fortschritt * EinheitenMax / 100 - 1
                Einheiten(i).Visible = True
            Next
            If Grafikengine.Grafikkarte Is Nothing Then Exit Do
            If Not Hauptmenü.MainMenü.Created Then Exit Do

            If Grafikengine.DeviceLost Then
                Grafikengine.AttemptRecovery() ' this is obvious, isn't it?
            End If
            If Grafikengine.DeviceLost Then Continue Do

            'Bildschirm säubern
            Grafikengine.Grafikkarte.Clear(ClearFlags.Target, System.Drawing.Color.Black, 1.0F, 0)
            'Szene beginnen
            Grafikengine.Grafikkarte.BeginScene()
            'wir teilen dem DirectX mit das wir nun 2D-Bilder zeichnen möchten
            Grafikengine.Sprite.Begin(SpriteFlags.AlphaBlend)
            'Malen
            Objektverwalter.VorHinBildmalen(Objektverwalter.texturHintergrungBild)

            For I = 0 To Einheiten.Length - 1
                If Einheiten(I).Laufen = True Then
                    NextZufallsWeg(I)
                End If
                Einheiten(I).Einheitmalen()
            Next

            'Denn Ladebalken malen

            Grafikengine.recBild = Nothing
            Grafikengine.szfScale = Nothing
            Grafikengine.ptfRotCenter = Nothing
            'Hinten
            Grafikengine.ptfPosition = New Point(Ladebalkenstart, Hauptmenü.MainMenü.MalPanel.Height - 150)
            For I = 0 To Ladebalkenbreite - 1
                Grafikengine.Sprite.Draw2D(TexturenHalter.GetBalken(False), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                Grafikengine.ptfPosition.X += 127
            Next
            Dim XMax As Integer = Fortschritt / 100 * Ladebalkenbreite * 127
            Dim Pos As New Point(Ladebalkenstart, Hauptmenü.MainMenü.MalPanel.Height - 150)
            For I = 0 To Ladebalkenbreite - 1
                If XMax > 127 Then
                    Grafikengine.fillRect(New Rectangle(Pos.X, Pos.Y, 127, 9), Color.Green)
                Else
                    Grafikengine.fillRect(New Rectangle(Pos.X, Pos.Y, XMax, 9), Color.Green)
                End If
                XMax -= 127
                Pos.X += 127
                If XMax < 0 Then
                    Exit For
                End If
            Next
            'Vorne
            Grafikengine.recBild = Nothing
            Grafikengine.szfScale = Nothing
            Grafikengine.ptfRotCenter = Nothing
            Grafikengine.ptfPosition = New Point(Ladebalkenstart, Hauptmenü.MainMenü.MalPanel.Height - 150)
            For I = 0 To Ladebalkenbreite - 1
                Grafikengine.Sprite.Draw2D(TexturenHalter.GetBalken(True), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                Grafikengine.ptfPosition.X += 127
            Next
            'Den Fortschritt anzeigen
            ObjektAlphabet.DrawString(Fortschritt.ToString + " %", 1, New Point(Hauptmenü.MainMenü.MalPanel.Width / 2 - 20, Hauptmenü.MainMenü.MalPanel.Height - 180), 0)

            'So einen blöden Tipp anzeigen.
            Grafikengine.recBild = Nothing
            Grafikengine.ptfRotCenter = Nothing
            With Grafikengine.szfScale
                .Width = Hauptmenü.MainMenü.MalPanel.Width / 3 + 10
                .Height = 25 * Beschreibung.Length
            End With
            Grafikengine.ptfPosition = New Drawing.Point(Hauptmenü.MainMenü.MalPanel.Width / 3 - 5, 195)
            Grafikengine.Sprite.Draw2D(TexturenHalter.GetBoxHintergrund(1), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
            Text.neuerText(ObjektLadebildschirm.Beschreibung, Hauptmenü.MainMenü.MalPanel.Width / 3, 200, Nothing)

            Schriftengine.DrawText(Text)

            If FertigGeladen Then
                Dim Y As Integer = 20
                For Each Spieler In Objektverwalter.Spielfeld.Spieler
                    If Spieler.Spieler > 0 Then
                        Dim X As Integer = 20
                        For Each MomKO In Spieler.KOS
                            If MomKO IsNot Nothing Then
                                MomKO.KOGesichtsausdruckMalen(0, X, Y)
                                X += 56
                            End If
                        Next
                        Y += 56
                    End If
                Next
            End If
            If Lademodus = Lademodi.KOAuswahl Then
                Dim Z As Integer = 0
                Grafikengine.ptfPosition = New Point(Hauptmenü.MainMenü.MalPanel.Width / 2 - 156, Hauptmenü.MainMenü.MalPanel.Height / 2 - 110)
                Dim XZähler As Integer = 0
                For Each ID In KOAuswahlKOS(KO).KOIDS
                    intColor = Color.FromArgb(180, 255, 255, 255)
                    Grafikengine.ptfRotCenter = Nothing
                    Grafikengine.szfScale = Nothing
                    Grafikengine.recBild = Nothing
                    Grafikengine.Sprite.Draw2D(KOAnzeigeTextur, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                    intColor = Color.FromArgb(255, 255, 255, 255)
                    With Grafikengine.recBild
                        .Y = 350
                        .Width = 48
                        .Height = 48
                    End With
                    Grafikengine.Sprite.Draw2D(Objektverwalter.KOS(ID).KOTextur, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)

                    If Z = SelectedKO Then
                        Grafikengine.recBild = Nothing
                        Grafikengine.Sprite.Draw2D(KOAnzeigeTextur, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                    End If
                    XZähler += 1
                    Z += 1
                    If XZähler > MaxKOX Then
                        XZähler = 0
                        Grafikengine.ptfPosition.X = Hauptmenü.MainMenü.MalPanel.Width / 2 - 156
                        Grafikengine.ptfPosition.Y += 52
                    Else
                        Grafikengine.ptfPosition.X += 56
                    End If
                Next
            End If
            MyBase.ObjekteMalen()
            ObjektMaus.Malen()


            Grafikengine.Sprite.End()
            'Szene beenden
            Grafikengine.Grafikkarte.EndScene()
            'Szene präsentieren
            Try
                Grafikengine.Grafikkarte.Present()    'draw device contents to screen
            Catch e As DeviceLostException
                'AAACK! We lost the device!
                Grafikengine.DeviceLost = True
            End Try


            If Zufallstexte Then
                If LetzteAktualiesierung + AnzeigeTextDauer < Now.Ticks Then
                    ObjektLadebildschirm.SetBrechreibung(Sprachconverter.GetRandomLadetext)
                    LetzteAktualiesierung = Now.Ticks
                End If
            End If
        Loop
        ObjektLadebildschirm.Ladebildschirm.RemoveHandles()
    End Sub
    Private Sub NextZufallsWeg(ByVal E As Integer)
        Dim WX(3) As Integer
        Dim WY(3) As Integer

        WX(3) = Einheiten(E).Position.X
        WY(3) = Einheiten(E).Position.Y
        For I = 0 To 2
            If Zufallszahl(1, 100) > 50 Then
                WX(2 - I) = Zufallszahl(0, XMax)
                WY(2 - I) = WY(3 - I)
            Else
                WX(2 - I) = WX(3 - I)
                WY(2 - I) = Zufallszahl(0, YMax)
            End If
        Next
        Einheiten(E).NeuerWeg(WX, WY)
    End Sub
    Public Overrides Sub MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        Select Case e.Button
            Case Windows.Forms.MouseButtons.Left
                If SelectedKO >= 0 Then
                    Objektverwalter.Spielfeld.Spieler(KOAuswahlKOS(KO).Spieler).KOS(KOAuswahlKOS(KO).KONummer) = ObjektLadeklasse.NewKO(Objektverwalter.KOS(KOAuswahlKOS(KO).KOIDS(SelectedKO)).KOID, KOAuswahlKOS(KO).Spieler)
                End If
                checkMouseDownObjekte(e.X, e.Y)
        End Select
    End Sub

    Public Overrides Sub MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        ObjektMaus.XKoordinate = e.X
        ObjektMaus.YKoordinate = e.Y
        MouseMoveObjekte(ObjektMaus.XKoordinate, ObjektMaus.YKoordinate)
        Dim SRechteck As New Rectangle(Hauptmenü.MainMenü.MalPanel.Width / 2 - 156, Hauptmenü.MainMenü.MalPanel.Height / 2 - 110, 48, 48)
        Dim Zähler As Integer = 0
        If KO >= 0 Then
            For I = 0 To KOAuswahlKOS(KO).KOIDS.Length - 1

                If SRechteck.Contains(e.Location) Then
                    If SelectableKO(I) Then
                        SelectedKO = I
                        Exit For
                    End If
                End If
                Zähler += 1
                If Zähler > MaxKOX Then
                    Zähler = 0
                    SRechteck.X = Hauptmenü.MainMenü.MalPanel.Width / 2 - 156
                    SRechteck.Y += 52
                Else
                    SRechteck.X += 56
                End If
                If I = KOAuswahlKOS(KO).KOIDS.Length - 1 Then
                    SelectedKO = -1
                End If
            Next
        End If
    End Sub
    Private Function SelectableKO(ByVal KOID As Integer) As Boolean
        If EinKOProArmee Then
            Dim Armys As Stack(Of String) = New Stack(Of String)
            For Each Spieler In Objektverwalter.Spielfeld.Spieler
                If Spieler.Spieler > 0 Then
                    For Each MomKO In Spieler.KOS
                        If MomKO IsNot Nothing Then
                            If Not Armys.Contains(MomKO.Armee) Then
                                Armys.Push(MomKO.Armee)
                            End If
                        End If
                    Next
                End If
            Next
            If Armys.Contains(Objektverwalter.KOS(KOID).KOID) Then
                Return False
            End If
        End If
        Return True
    End Function
    Public Overrides Sub MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        Select Case e.Button
            Case Windows.Forms.MouseButtons.Left
                ButtonGeklicktLinks(checkMouseUPObjekte(ObjektMaus.XKoordinate, ObjektMaus.YKoordinate))
        End Select
    End Sub

    Public Overrides Sub MouseWheel(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)

    End Sub
    Public Overrides Sub SetMausBild()

    End Sub
    Public Overrides Sub SprachEingabe(ByVal Eingabe As String)

    End Sub
    Public Sub SpielFertigGeladen()
        Fortschritt = 100
        Duration = EinzelladeDauer * ArmeeEiheitenZahl + 10
        ObjektMaus.Visible = True
        If KOAuswahlKOS.Length > 0 Then
            UpdateTexturen(0)
            KO = 0
            NeuButton(Hauptmenü.MainMenü.MalPanel.Width / 2 + 60, Hauptmenü.MainMenü.MalPanel.Height - 30, My.Settings.Resourcenpfad + "Objekte\Button.png", "Weiter", New PointF(0.5#, 1))
            NeuButton(Hauptmenü.MainMenü.MalPanel.Width / 2 - 164, Hauptmenü.MainMenü.MalPanel.Height - 30, My.Settings.Resourcenpfad + "Objekte\Button.png", "Zurück", New PointF(0.5#, 1))
            Lademodus = Lademodi.KOAuswahl
        End If
        NeuButton(Hauptmenü.MainMenü.MalPanel.Width / 2 - 52, Hauptmenü.MainMenü.MalPanel.Height - 30, My.Settings.Resourcenpfad + "Objekte\Button.png", "Starten", New PointF(0.5#, 1))

        FertigGeladen = True
    End Sub
    Private Sub UpdateTexturen(ByVal KOÄnderung As Integer)
        KO += KOÄnderung
        If KO < 0 Then KO = 0
        If KO >= KOAuswahlKOS.Length Then KO = KOAuswahlKOS.Length - 1
        KOAnzeigeTextur = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Kartenauswahl\KOAnzeigeCursor.png"), Hauptmenü.Farbtabelleerstellen(Objektverwalter.Spielfeld.Spieler(KOAuswahlKOS(KO).Spieler).Farbe))
    End Sub
    Public Sub RemoveHandles()
        RemoveHandler Hauptmenü.MainMenü.MalPanel.MouseMove, AddressOf MouseMove
        RemoveHandler Hauptmenü.MainMenü.MalPanel.MouseDown, AddressOf MouseDown
        RemoveHandler Hauptmenü.MainMenü.KeyDown, AddressOf KeyDown
        RemoveHandler Hauptmenü.MainMenü.MalPanel.MouseMove, AddressOf MouseMove
        RemoveHandler Hauptmenü.MainMenü.MalPanel.MouseUp, AddressOf MouseUp
        Loadingthread.Abort()
        Loadingthread = Nothing
        Ladebildschirm = Nothing
        ReDim KOAuswahlKOS(-1)
    End Sub
    Public Overrides Sub ChangeWindowSize(ByVal PosChange As System.Drawing.Point)
        MyBase.ChangeWindowSizeObjekte(PosChange)
        Dim R As Integer
        Ladebalkenbreite = Math.DivRem(Hauptmenü.MainMenü.MalPanel.Width - 200, 127, R)
        Ladebalkenstart = 100 + R / 2
        YMax = Math.DivRem(Hauptmenü.MainMenü.MalPanel.Height, 16, 0)
        XMax = Math.DivRem(Hauptmenü.MainMenü.MalPanel.Width, 16, 0)
    End Sub
    ''' <summary>
    ''' Beendet alles!
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub Close()

    End Sub
    ''' <summary>
    ''' Lädt die Karte und setzt je nach Menü noch andere Werte fest.
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub Laden()
        Dim Scripts() As ObjektScript = {}
        If Name.ToLower = "auto-zufallskarte" Then
            Dim M As ObjektKartenauswahlMenü = Objektverwalter.Menü
            Objektverwalter.Spielfeld = M.SpielKarten(ObjektKartenauswahlMenü.AngezeigteKarten(ObjektKartenauswahlMenü.MomentaneKarte))
        Else
            Hauptmenü.Laden(Name, GesamterName, Endung, Texturenladen, Updateframe)
        End If
        If Objektverwalter.Spielfeld Is Nothing Then
            MsgBox("The input map wasn't found, check if the Record has the correct Map input and if the selected map is a valid Commander Wars Map", MsgBoxStyle.Critical, "Map Error")
            Ladebildschirm = Nothing
            Starten = True
            Hauptmenü.Ini(Hauptmenü.Formmodi.Hauptmenü)
            Exit Sub
        End If
        If TypeOf Objektverwalter.Menü Is ObjektKartenauswahlLandkartenMenü Then
            Dim M As ObjektKartenauswahlLandkartenMenü = Objektverwalter.Menü
            For I = 0 To Objektverwalter.Spielfeld.Spieler.Length - 1
                ReDim Objektverwalter.Spielfeld.Spieler(I).KOS(1)
            Next

            Dim SpielmodusGesetzt As Boolean = False
            'Ini gefällig?
            If My.Computer.FileSystem.FileExists(M.LandkartenInfo.KampagnenOrdner + M.LandkartenInfo.Missionen(M.AusgewählteMission).Missionsname + ".ini") Then
                Dim ScriptDat As String = ""
                Dim SofortStart As Boolean = False
                Dim strR As New IO.StreamReader(M.LandkartenInfo.KampagnenOrdner + M.LandkartenInfo.Missionen(M.AusgewählteMission).Missionsname + ".ini", System.Text.Encoding.Default)
                Dim Regeln As ObjektRegeln '???                 M.SpielKarten(AngezeigteKarten(MomentaneKarte)).Regeln
                Regeln = New ObjektRegeln(False, Objektverwalter.Spielfeld.Spieler.Length - 1, New ObjektRegeln.Siegbedingungen() {}, False, New Integer() {1, 0, 0, 0}, , , , , , , False)

                'Noch ein paar Standartsachen...
                While Not strR.EndOfStream
                    Dim z As String = strR.ReadLine
                    z = z.Trim
                    If z = "" Then Continue While 'Leerzeilen ignorieren
                    If z.StartsWith("'") Then Continue While 'Kommentare werden ebenfalls ignoriert. Man kann allerdings so nicht hinter eine Befehlszeile einen kommentar setzten, so wie hier :)

                    If z.StartsWith("Script:") Then ScriptDat = z.Remove(0, 7)
                    If z.StartsWith("Name:") Then Objektverwalter.Spielfeld.Kartenname = z.Remove(0, 5)
                    If z.StartsWith("Desc:") Then Objektverwalter.Spielfeld.Beschreibung = z.Remove(0, 5)

                    If z.StartsWith("NächsteKarte:") Then
                        Dim unnötiges As String = My.Settings.Resourcenpfad + "Karten\"
                        Dim Pfad As String = M.LandkartenInfo.KampagnenOrdner
                        Pfad = Pfad.Remove(0, unnötiges.Length)
                        If Pfad.Contains("\") Then
                            'Brauchen wir hier nicht mehr... 
                            'Pfad = Pfad.Remove(Pfad.LastIndexOf("\") + 1)
                        Else
                            'Wir sind in keinem Unterordner und alles ist in Ordnung.
                            Pfad = ""
                        End If
                        Objektverwalter.Spielfeld.NächsteKarte = Pfad + z.Remove(0, 13)
                    End If
                    If z.ToLower.StartsWith("koproarmee|") Then
                        EinKOProArmee = z.Split("|")(1)
                    End If
                    If z.ToLower.StartsWith("ko|") Then 'Ein KO soll festgelegt werden.
                        Dim s() As String = z.Split("|")

                        If s(3) = "-" Then
                            Objektverwalter.Spielfeld.Spieler(s(1)).KOS(s(2)) = Nothing 'Hier soll es keinen KO geben. geht das so oder ist Nothing nicht der richtige Befehl?
                        ElseIf s.Length > 4 Then
                            'Jetzt sollten wir irgendwie machen das man den KO auswählen kann
                            'Jetzt nehmen wir einfach den ersten
                            Array.Resize(KOAuswahlKOS, KOAuswahlKOS.Length + 1)
                            Dim KOIDS(s.Length - 4) As Integer
                            For I = 3 To s.Length - 1
                                For I2 = 0 To Objektverwalter.KOS.Length - 1
                                    If Objektverwalter.KOS(I2).KOID = s(I).ToUpper Then
                                        KOIDS(I - 3) = I2
                                        Exit For
                                    End If
                                Next
                            Next
                            KOAuswahlKOS(KOAuswahlKOS.Length - 1) = New KOAuswahl(KOIDS, s(1), s(2))
                            Objektverwalter.Spielfeld.Spieler(s(1)).KOS(s(2)) = ObjektLadeklasse.NewKO(s(3), s(1))
                        Else
                            Objektverwalter.Spielfeld.Spieler(s(1)).KOS(s(2)) = ObjektLadeklasse.NewKO(s(3), s(1))
                        End If
                        If s(2) = 0 Then
                            Objektverwalter.Spielfeld.Spieler(s(1)).Armee = Objektverwalter.Spielfeld.Spieler(s(1)).KOS(0).Armee
                        End If
                    End If
                    If z.StartsWith("Team|") Then
                        Dim s() As String = z.Split("|")
                        Objektverwalter.Spielfeld.Spieler(s(1)).Team = s(2)
                    End If
                    If z.StartsWith("KI|") Then
                        Dim s() As String = z.Split("|")
                        Objektverwalter.Spielfeld.Spieler(s(1)).KIStufe = CInt(s(2)).ToString
                    End If
                    If z.StartsWith("Farbe|") Then
                        Dim s() As String = z.Split("|")
                        If s(2).EndsWith(".bmp") Then
                            Objektverwalter.Spielfeld.Spieler(s(1)).Farbe = Hauptmenü.CStringColor(s(2))
                        Else
                            Objektverwalter.Spielfeld.Spieler(s(1)).Farbe = Color.FromArgb(CInt(s(2)))
                        End If
                    End If
                    If z.StartsWith("StartGeld|") Then
                        Dim s() As String = z.Split("|")
                        Objektverwalter.Spielfeld.Spieler(s(1)).SetFonds(s(2))
                    End If
                    If z.ToLower.StartsWith("FondsPS|".ToLower) Then
                        Dim s() As String = z.Split("|")
                        Objektverwalter.Spielfeld.Spieler(s(1)).FondsproStadt = s(2)
                    End If
                    If z.ToLower.StartsWith("FondsPF|".ToLower) Then
                        Dim s() As String = z.Split("|")
                        Objektverwalter.Spielfeld.Spieler(s(1)).Fabrikfonds = s(2)
                    End If

                    If z.ToLower.StartsWith("bauliste|") Then
                        Dim s As String() = z.Split("|")
                        Dim Bauliste As Baulisten = CInt(s(2))
                        If s(1) = 0 Then
                            For i = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
                                Objektverwalter.Spielfeld.Spieler(i).Bauliste = New Bauliste(ObjektLadeklasse.GetBauliste(Bauliste))
                            Next
                        Else
                            Objektverwalter.Spielfeld.Spieler(s(1)).Bauliste = New Bauliste(ObjektLadeklasse.GetBauliste(Bauliste))
                        End If
                    End If
                    'Wir setzen die Bauprioriäten
                    If z.ToLower.StartsWith("bauprioritäten|") Then
                        Dim s As String() = z.Split("|")
                        If s(1) = 0 Then
                            For i = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
                                Objektverwalter.Spielfeld.Spieler(i).Bauprioritäten = New KIGenerellerSuperBau.PrioritätsBau(s(2), s(3), s(4), s(5), s(6), s(7), s(8), s(9), s(10), False)
                            Next
                        Else
                            Objektverwalter.Spielfeld.Spieler(s(1)).Bauprioritäten = New KIGenerellerSuperBau.PrioritätsBau(s(2), s(3), s(4), s(5), s(6), s(7), s(8), s(9), s(10), False)
                        End If
                    End If

                    'Alles mit den Regeln.
                    If z.ToLower.StartsWith("siegbedingungen|") Then
                        Dim s() As String = z.Split("|")
                        Select Case s(1).ToLower
                            Case "aus", "off"
                                Array.Resize(Regeln.StandartSiegbedingungen, 0)
                                ReDim Regeln.Besiegbar(-1, -1)
                            Case "hq sieg", "hqsieg"
                                Regeln.SiegBedingungHinzufügen(ObjektRegeln.Siegbedingungen.KeineHQs, Objektverwalter.Spielfeld.Spieler.Length - 1)
                            Case "einheiten sieg", "einheitensieg"
                                Regeln.SiegBedingungHinzufügen(ObjektRegeln.Siegbedingungen.KeineEinheiten, Objektverwalter.Spielfeld.Spieler.Length - 1)
                            Case "besetzung sieg", "besetzungsieg"
                                Regeln.SiegBedingungHinzufügen(ObjektRegeln.Siegbedingungen.Besetzungen, Objektverwalter.Spielfeld.Spieler.Length - 1, s(2))
                            Case "zeit sieg", "zeitsieg"
                                Regeln.SiegBedingungHinzufügen(ObjektRegeln.Siegbedingungen.Zeit, Objektverwalter.Spielfeld.Spieler.Length - 1, s(2))
                        End Select
                    End If

                    If z.ToLower.StartsWith("unbesiegbar|") Then
                        Regeln.AddUnbesiegbar(z.Split("|")(1))
                    End If

                    If z.ToLower = "SofortStart=1".ToLower Then SofortStart = True
                    If z.ToLower = "SofortStart=0".ToLower Then SofortStart = False

                    If z.ToLower = "ZufallsWetter=1".ToLower Then Regeln.Zufallswetter = True
                    If z.ToLower = "ZufallsWetter=0".ToLower Then Regeln.Zufallswetter = False

                    If z.ToLower = "baublockade=1" Then Regeln.BauBlockade = True
                    If z.ToLower = "baublockade=0" Then Regeln.BauBlockade = False

                    If z.ToLower.StartsWith("teuerungsrate=") Then
                        Regeln.Teurungsrate = z.Split("=")(1)
                    End If

                    If z.ToLower.StartsWith("startwetter=") Then
                        Regeln.Standardwetter = z.Split("=")(1)
                    End If

                    If z.ToLower = "Kriegsnebel=0".ToLower Then Regeln.Nebel = Nebelarten.Aus
                    If z.ToLower = "Kriegsnebel=1".ToLower Then Regeln.Nebel = Nebelarten.Nebel
                    If z.ToLower = "Kriegsnebel=2".ToLower Then Regeln.Nebel = Nebelarten.Kriegsnebel

                    If z.ToLower = "Luftschlacht=0".ToLower Then Regeln.Luftschlacht = False
                    If z.ToLower = "Luftschlacht=1".ToLower Then Regeln.Luftschlacht = True

                    If z.ToLower = "LevelModus=0".ToLower Then Regeln.LevelModus = False
                    If z.ToLower = "LevelModus=1".ToLower Then Regeln.LevelModus = True

                    If z.ToLower.StartsWith("gamemode:") Then
                        Dim GM As Integer = z.Remove(0, 9) - 1
                        If GM >= 0 Then
                            If GM <> My.Settings.CommanderWarsGameMoodus Then
                                If GM >= 0 Then
                                    SpielmodusGesetzt = True
                                    My.Settings.CommanderWarsGameMoodus = GM
                                    Objektverwalter.LoadNewGameModus(My.Settings.TerrainStyle)
                                End If
                            End If
                        End If
                    End If

                End While
                If SpielmodusGesetzt = False Then
                    If M.LandkartenInfo.Spielmodus <> My.Settings.CommanderWarsGameMoodus Then
                        My.Settings.CommanderWarsGameMoodus = M.LandkartenInfo.Spielmodus
                        Objektverwalter.LoadNewGameModus(My.Settings.TerrainStyle)
                    End If
                End If


                strR.Dispose()
                'eventuell noch das Script laden...
                If Not ScriptDat = "" Then 'Offensichtlich gibt es was..
                    ObjektScript.NeuScript(ScriptDat)
                    If IsNothing(Objektverwalter.Spielfeld.Scripts) Then
                        ReDim Objektverwalter.Spielfeld.Scripts(0)
                    Else
                        Array.Resize(Objektverwalter.Spielfeld.Scripts, Objektverwalter.Spielfeld.Scripts.Length + 1)
                    End If
                    Objektverwalter.Spielfeld.Scripts = ObjektScript.Scripts
                End If
                Objektverwalter.Spielfeld.Regeln = Regeln
            End If
            Objektverwalter.Spielfeld.ObjektLandkartenInfo = M.LandkartenInfo

            For I = 0 To Objektverwalter.Spielfeld.Spieler.Length - 1
                'Zufällige KO's festlegen!
                Objektverwalter.Spielfeld.Spieler(I).KOS = ObjektKartenauswahlMenü.SelectRandomCO(Objektverwalter.Spielfeld.Spieler(I).KOS, I, Objektverwalter.Spielfeld.GetCommanderWarsModus)
                'Spieler erschaffen.
                Objektverwalter.Spielfeld.Spieler(I) = New ObjektSpieler(I, Objektverwalter.Spielfeld.Spieler(I).Farbe, Objektverwalter.Spielfeld.Spieler(I).FondsproStadt, Objektverwalter.Spielfeld.Spieler(I).KOS, Objektverwalter.Spielfeld.Spieler(I).Fonds, Objektverwalter.Spielfeld.Spieler(I).Armee, Objektverwalter.Spielfeld.Spieler(I).Team, Objektverwalter.Spielfeld.Spieler(I).Bauliste, Objektverwalter.Spielfeld.Spieler(I).KIStufe, Objektverwalter.Spielfeld.Spieler(I).Fabrikfonds)
                If Objektverwalter.Spielfeld.Spieler(I).KOS(0) Is Nothing Then
                    Objektverwalter.Spielfeld.Spieler(I).KOS(0) = ObjektLadeklasse.NewKO("OFFIZIEROS", I)
                End If
            Next
        ElseIf TypeOf Objektverwalter.Menü Is ObjektKartenauswahlMenü Then
            Dim M As ObjektKartenauswahlMenü = Objektverwalter.Menü
            'Die Scriptverweise und die Nächste Karte mitübergeben.
            Objektverwalter.Spielfeld.NächsteKarte = M.SpielKarten(ObjektKartenauswahlMenü.MomentaneKarte).NächsteKarte
            Objektverwalter.Spielfeld.Scripts = M.SpielKarten(ObjektKartenauswahlMenü.MomentaneKarte).Scripts
            Dim Spieler(M.Farbtabellen.Length - 1) As ObjektSpieler
            For I = 0 To M.Farbtabellen.Length - 1
                Dim neuKOS() As ObjektKO = {M.KOS(I, 0), M.KOS(I, 1)}
                'Zufällige KO's auswählen!
                neuKOS = ObjektKartenauswahlMenü.SelectRandomCO(neuKOS, I, My.Settings.CommanderWarsGameMoodus)
                If M.KIStufen(I) = ObjektSpieler.KIStufen.Geschlossen Then
                    Spieler(I) = New ObjektSpieler(I, M.Farbtabellen(I), M.FondsproStadt(I), New ObjektKO() {New KOOffizierOS(I), Nothing}, 0, Armeen.OS.ToString, "q", Nothing, ObjektSpieler.KIStufen.Geschlossen, 0)
                Else
                    Spieler(I) = New ObjektSpieler(I, M.Farbtabellen(I), M.FondsproStadt(I), neuKOS, M.Startfonds(I), neuKOS(0).Armee, M.Teams(I), M.Baulisten(I), M.KIStufen(I), M.FondsproFabrik(I))
                    Spieler(I).Bauprioritäten = M.SpielerBauprioritäten(I)
                End If
            Next
            Objektverwalter.Spielfeld.Spieler = Spieler
            Objektverwalter.Spielfeld.Scripts = M.SpielKarten(ObjektKartenauswahlMenü.AngezeigteKarten(ObjektKartenauswahlMenü.MomentaneKarte)).Scripts
            ObjektScript.Scripts = M.SpielKarten(ObjektKartenauswahlMenü.AngezeigteKarten(ObjektKartenauswahlMenü.MomentaneKarte)).Scripts
            'Wir erstellen die Regeln dieses Spiels
            If Not Hauptmenü.NetzConnected Then
                Objektverwalter.Spielfeld.Regeln = M.Regeln
            End If
        ElseIf Hauptmenü.AufzeichnungLaden Then
            'eine Aufzeichnung laden
            Objektverwalter.Spielfeld.Spieler(0) = New ObjektSpieler(0, Hauptmenü.SpielerNeutral, 0, New ObjektKO() {New KOOffizierOS(0), Nothing}, 0, Armeen.OS.ToString, "", Nothing, ObjektSpieler.KIStufen.Kinderleicht, 0)
            For i = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
                Dim sSp() As String = Hauptmenü.AufzeichnungStrR.ReadLine.Remove(0, 8).Split("|")
                Dim KO As ObjektKO = ObjektLadeklasse.NewKO(sSp(2), i)
                Dim B As Bauliste = Nothing
                If sSp(6).ToLower <> "nothing" Then
                    B = New Bauliste(sSp(6).Split("_"))
                End If
                Objektverwalter.Spielfeld.Spieler(i) = New ObjektSpieler(sSp(0), Color.FromArgb(CInt(sSp(8))), sSp(4), New ObjektKO() {KO, ObjektLadeklasse.NewKO(sSp(3), i)}, sSp(7), KO.Armee, sSp(1), B, ObjektSpieler.KIStufen.Passiv, sSp(5))
            Next
        End If
        If Objektverwalter.Spielfeld.CommanderWarsModus <> My.Settings.CommanderWarsGameMoodus Then
            Objektverwalter.Spielfeld.CommanderWarsModus = My.Settings.CommanderWarsGameMoodus
        End If
        'Im 3D Spiel die Farben erstellen!
        If My.Settings.draw3D Then
            ObjektLadeklasse.Gebäude3D.IniSpielerfarben()
        End If
        If Not Zufallstexte Then
            Objektverwalter.Spielfeld.Beschreibung = ""
            For I = 0 To Beschreibung.Length - 1
                If I = Beschreibung.Length - 1 Then
                    Objektverwalter.Spielfeld.Beschreibung += Beschreibung(I)
                Else
                    Objektverwalter.Spielfeld.Beschreibung += Beschreibung(I) + " "
                End If
            Next
        End If

        Objektverwalter.ArmeeTexturenLaden(Objektverwalter.Spielfeld.Spieler)
        ObjektLadebildschirm.Ladebildschirm.SpielFertigGeladen()
    End Sub
End Class
